import axios from 'axios'
import {Modal} from 'ant-design-vue';
import router from '@/router.js'
import {hideLoading} from "@/util/util.js";
// 创建一个axios实例
const axios_instance = axios.create()
// 设置axios拦截器：请求拦截器
axios_instance.interceptors.request.use(config => {
    //请求拦截一般会有哪些操作
    // 1.比如config中的一些信息不符合服务器的要求,这里可以做一些修改
    // 2.比如每次发送网络请求时,都希望在界面中显示一个请求的图标(然后再响应拦截中取消显示)
    // 3.某些网络请求必须携带一些特殊的信息(如登录token),如果没有携带就可以拦截并作响应提示

    // 给请求头添加token
    /*
    * 其中   /.*csrftoken=([^;.]*).*$/    是一个正则表达式，用于从cookie中获取csrftoken的值 ，
    * ([^;.]*) 是命名捕获，表示从匹配到的内容中 只获得 ()内的值。
    * string.match(regex) 得到的是一个数组， 第0项是匹配到的全部内容，第1项是通过命名捕获得到的内容，在这里就是csrftoken的值。
    * 这样就完成了使用axios发送请求的正确配置了，同时保证了网站免受csrf攻击的影响.
    */
    if (!config.withNoToken) {
        const token = getToken();
        config.headers['Authorization'] = 'Bearer ' + token;
    }
    // config.headers['X-Requested-With'] = 'XMLHttpRequest';
    // let regex = /.*csrftoken=([^;.]*).*$/; // 用于从cookie中匹配 csrftoken值
    // config.headers['X-CSRFToken'] = document.cookie.match(regex) === null ? null : document.cookie.match(regex)[1];
    return config
}, err => {
    // 请求未成功发出，如：没有网络...
    return Promise.reject(err)
})
// 设置axios拦截器: 响应拦截器
axios_instance.interceptors.response.use(res => {
    // 成功响应的拦截
    if (res.headers.authorization) {
        //需要更新token
        setToken(res.headers.authorization)
    }
    return Promise.resolve(res.data)
}, err => {
    // 失败响应的拦截
    if (err.response) {
        hideLoading()
        // 失败响应的status需要在response中获得
        switch (err.response.status) {
            // 对得到的状态码的处理，具体的设置视自己的情况而定
            case 401:
                console.error('未登录')
                //提醒用户是否跳转到登录页面
                Modal.confirm({
                    title: '登录超时',
                    content: '是否跳转到登录页面',
                    okText: '确认',
                    cancelText: '取消',
                    onOk() {
                        router.replace({path: '/login'})
                    },
                    onCancel() {
                        console.log('cancle');
                    }
                });
                // window.location.href='/'
                break
            case 404:
                // window.location.href='/'
                break
            case 405:
                console.error('不支持的方法')
                break
            // case ...
            default:
                console.error('其他错误')
                break
        }
    }
    // 注意这里应该return promise.reject(),
    // 因为如果直接return err则在调用此实例时，响应失败了也会进入then(res=>{})而不是reject或catch方法
    return Promise.reject(err)
})

export default axios_instance

function getToken() {
    let tokenStr = localStorage.getItem("admin_token");
    return tokenStr || '';
}

function setToken(token) {
    let _token = token || ''
    localStorage.setItem("admin_token", _token);
}

export {
    getToken
}
